package com.eps.sumi;

import java.io.File;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.eps.util.Utiles_MensajesEmail;

@Controller
public class ReporteController {

	//@Resource(name = "SQLDataSource")
	@Autowired
	@Qualifier("SQLDataSource")
	DataSource dsAdministracion;

	@SuppressWarnings("unchecked")
	protected ModelAndView generaReporte(String reporte, Map parametros,
			String nombre_archivo_salida, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		Connection connection = null;
		ServletOutputStream out = null;
		try {
			connection = dsAdministracion.getConnection();

			parametros.put("REPORT_LOCALE", java.util.Locale.ENGLISH);
			parametros.put("SUBREPORT_DIR", request.getSession()
					.getServletContext().getRealPath("/WEB-INF/reportes/")
					+ "/");

			// HttpServletRequestWrapper srw = new
			// HttpServletRequestWrapper(request);
			// String path = srw.getRealPath("") + "\\reportes\\clientes.jrxml";
			// JasperDesign jasperDesign = JRXmlLoader.load(path);
			// JasperReport jasperReport =
			// JasperCompileManager.compileReport(jasperDesign);
			// byte[] bytes = JasperRunManager.runReportToPdf(jasperReport,
			// null, connection);
			// res.setContentType("application/pdf");
			// res.setContentLength(bytes.length);
			// out = res.getOutputStream();
			// out.write(bytes, 0, bytes.length);

			JasperReport jasperReport = (JasperReport) JRLoader
					.loadObject(request.getSession().getServletContext()
							.getRealPath("/WEB-INF/reportes/" + reporte));
			// JasperReport jasperReport =
			// JasperCompileManager.compileReport(request.getSession().getServletContext().getRealPath("/WEB-INF/reportes/"+reporte));
			byte[] bytes = JasperRunManager.runReportToPdf(jasperReport,
					parametros, connection);
			response.setContentType("application/pdf");
			response.setHeader("Content-disposition", "inline; filename="
					+ nombre_archivo_salida + ".pdf");
			response.setHeader("Cache-Control", "max-age=30");
			response.setHeader("Pragma", "No-cache");
			response.setDateHeader("Expires", 0);
			response.setContentLength(bytes.length);
			out = response.getOutputStream();
			out.write(bytes, 0, bytes.length);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connection.close();
			out.flush();
			out.close();
		}
		return null;
	}

	public byte[] generaArchivoReporte(String reporte, Map parametros,
			HttpServletRequest request) {
		Connection connection = null;
		ServletOutputStream out = null;
		byte[] bytes = null;
		try {
			connection = dsAdministracion.getConnection();

			parametros.put("REPORT_LOCALE", java.util.Locale.ENGLISH);
			parametros.put("SUBREPORT_DIR", request.getSession()
					.getServletContext().getRealPath("/WEB-INF/reportes/")
					+ "/");

			JasperReport jasperReport = (JasperReport) JRLoader
					.loadObject(request.getSession().getServletContext()
							.getRealPath("/WEB-INF/reportes/" + reporte));
			// JasperReport jasperReport =
			// JasperCompileManager.compileReport(request.getSession().getServletContext().getRealPath("/WEB-INF/reportes/"+reporte));
			bytes = JasperRunManager.runReportToPdf(jasperReport, parametros,
					connection);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return bytes;
	}

	protected ModelAndView generaReporteASwf(String reporte, Map parametros,
			String nombre_archivo_salida, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		//String comando ="cmd /c del "+request.getSession().getServletContext().getRealPath("/swf/*.swf"); //windows
		String comando ="rm "+request.getSession().getServletContext().getRealPath("/swf/*.swf"); //linux
		Runtime.getRuntime().exec(comando);
		
		//comando ="cmd /c del "+request.getSession().getServletContext().getRealPath("/swf/*.pdf"); //windows
		comando ="rm "+request.getSession().getServletContext().getRealPath("/swf/*.pdf"); //linux
		Runtime.getRuntime().exec(comando);
		
		File file = new File(request.getSession()
				.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".pdf").replace("\\", "/"));
		FileOutputStream fos = new FileOutputStream(file);
		fos.write( this.generaArchivoReporte(reporte, parametros, request));
		fos.flush();
		fos.close(); 
		
		/*comando = "C:/Program Files (x86)/SWFTools/pdf2swf.exe "+request.getSession()
		.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".pdf").replace("\\", "/")+" -o "+request.getSession()
		.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".swf").replace("\\", "/")+" -T 9 -f";//windows*/
		
		comando = "pdf2swf "+request.getSession()
		.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".pdf").replace("\\", "/")+" -o "+request.getSession()
		.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".swf").replace("\\", "/")+" -T 9 -f";//linux*/
		

		 Runtime.getRuntime().exec(comando);
		 File f = new File(request.getSession()
					.getServletContext().getRealPath("/swf/"+nombre_archivo_salida+".swf"));
		 while(!f.exists()){
			 System.out.println("no existe");
		 }
		 //Thread.sleep(2000);
		 //file.delete();
		 ModelAndView mv = new ModelAndView(
			"frmVisualizaReporte");
		 mv.addObject("nombre_archivo", nombre_archivo_salida);
		 
		 return mv;
		 
	}
	
	@RequestMapping(value = "/ver_reporte_orden", method = RequestMethod.GET)
	public ModelAndView handleRequestSalida(@RequestParam String codigo,
			@RequestParam boolean tipo_compra,@RequestParam int op_visualiza, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		Map parametros = new HashMap();
		parametros.put("cod_orden", codigo);
		
		String reporte = (tipo_compra)?"ReporteOrdenInterno.jasper":"ReporteOrdenInternoServicio.jasper";
		ModelAndView mv = (op_visualiza == 1)?generaReporte(reporte,parametros, codigo, request, response):
											  generaReporteASwf(reporte, parametros, codigo, request, response);
		return mv;
	}
	
	@RequestMapping(value = "/ver_plantilla_inventario", method = RequestMethod.GET)
	public ModelAndView verPlantillaInventario(@RequestParam int codigo,
			 HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		Map parametros = new HashMap();
		parametros.put("ubicacion", codigo);
		parametros.put("id_empresa", "001");
		parametros.put("REPORT_LOCALE",new  java.util.Locale("es","ES"));

		return generaReporte("reporte_padron_inventario.jasper", parametros,
					"plantilla_inventario_"+codigo, request, response);
		
	}

	@RequestMapping(value = "/ver_reporte_necesidades_costos", method = RequestMethod.GET)
	public ModelAndView verRequerrimientosCentro(
			@RequestParam String unidad_org,
			@RequestParam String cod_centro_costo, @RequestParam String anio,
			@RequestParam String usuario,@RequestParam int op_visualiza, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		Map<String, Serializable> parametros = new HashMap<String, Serializable>();
		parametros.put("id_empresa", "001");
		parametros.put("anio", anio);
		parametros.put("unidad_organizativa", unidad_org);
		parametros.put("centro_costos", cod_centro_costo);
		parametros.put("id_usuario", usuario);

		return (op_visualiza == 1)?generaReporte("ReporteRequerrimientosAprobados.jasper",
									parametros, "requerimientos_anuales_" + anio, request, response):
										generaReporteASwf("ReporteRequerrimientosAprobados.jasper",
												parametros, "requerimientos_anuales_" + anio, request, response);
	}

	@RequestMapping(value = "/ver_reporte_ordenes", method = RequestMethod.GET)
	public ModelAndView verReporteOrdenes(@RequestParam String id_zona,
			@RequestParam String anio, @RequestParam String mes,
			@RequestParam int tipo_orden, @RequestParam String desc_tipo_orden,
			@RequestParam int op_visualiza,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Map parametros = new HashMap();
		parametros.put("anio", anio);
		parametros.put("mes", mes);
		parametros.put("id_empresa", "001");
		parametros.put("id_zona", id_zona);
		parametros.put("tipo_orden", tipo_orden);
		parametros.put("dtipo_orden", desc_tipo_orden);

		return (op_visualiza == 1)?generaReporte("reporteOrdenesCompra.jasper", parametros,
				"reporte_ordenes_" + desc_tipo_orden + "_Z" + id_zona + "_"+ anio + "_" + mes, request, response):
					generaReporteASwf("reporteOrdenesCompra.jasper", parametros,
							"reporte_ordenes_" + desc_tipo_orden + "_Z" + id_zona + "_"+ anio + "_" + mes, request, response);
	}

	@RequestMapping(value = "/ver_reporte_prov_por_sumi", method = RequestMethod.GET)
	public ModelAndView verReporteProveedoresPorSumi(@RequestParam String sumi,
			@RequestParam String fecha_desde, @RequestParam String fecha_hasta,@RequestParam int op_visualiza,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Map parametros = new HashMap();
		parametros.put("id_empresa", "001");
		parametros.put("id_suministro", sumi);

		if (fecha_desde.trim().length() == 0
				|| fecha_hasta.trim().length() == 0) {
			return (op_visualiza == 1)?generaReporte("Reporte_proveedor_por_suministros.jasper",
					parametros, "reporte_proveedores_por_suministro_" + sumi.trim(),request, response):
						generaReporteASwf("Reporte_proveedor_por_suministros.jasper",
								parametros, "reporte_proveedores_por_suministro_" + sumi.trim(),request, response);
		} else {
			parametros.put("f_inicio", fecha_desde);
			parametros.put("f_fin", fecha_hasta);
			return (op_visualiza == 1)?generaReporte(
					"Reporte_proveedor_por_suministros_fechas.jasper",
					parametros, "reporte_proveedores_por_suministro_" + sumi.trim(),request, response):
						generaReporteASwf(
								"Reporte_proveedor_por_suministros_fechas.jasper",
								parametros, "reporte_proveedores_por_suministro_" + sumi.trim(),request, response);
		}

	}
	
	@RequestMapping(value = "/ver_reporte_ordenes_por_proveedor", method = RequestMethod.GET)
	public ModelAndView verReporteOrdenesPorProveedor(@RequestParam String cod_proveedor,
			@RequestParam String id_zona,@RequestParam int tipo_orden,@RequestParam String desc_tipo_orden,
			@RequestParam String fecha_desde, @RequestParam String fecha_hasta,@RequestParam int op_visualiza,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Map parametros = new HashMap();
		parametros.put("id_empresa", "001");
		parametros.put("id_zona", id_zona);
		parametros.put("cod_proveedor",cod_proveedor);
		parametros.put("tipo_orden",tipo_orden);
		parametros.put("dtipo_orden",desc_tipo_orden);

		if (fecha_desde.trim().length() == 0
				|| fecha_hasta.trim().length() == 0) {
			return (op_visualiza == 1)?generaReporte("reporte_ordenes_proveedor.jasper",
					parametros, "reporte_ordenes_por_proveedor_" + cod_proveedor,request, response):
						generaReporteASwf("reporte_ordenes_proveedor.jasper",
								parametros, "reporte_ordenes_por_proveedor_" + cod_proveedor,request, response);
		} else {
			parametros.put("f_inicio", fecha_desde);
			parametros.put("f_fin", fecha_hasta);
			return (op_visualiza == 1)?generaReporte(
					"reporte_ordenes_proveedor_fechas.jasper",
					parametros, "reporte_ordenes_por_proveedor_" + cod_proveedor,request, response):
						generaReporteASwf(
								"reporte_ordenes_proveedor_fechas.jasper",
								parametros, "reporte_ordenes_por_proveedor_" + cod_proveedor,request, response);
		}

	}
	
	@RequestMapping(value = "/ver_reporte_analisis_inventario", method = RequestMethod.GET)
	public ModelAndView verReporteAnalisisInventario(@RequestParam String id_zona,
			@RequestParam int op_visualiza,HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Map parametros = new HashMap();
		parametros.put("id_empresa", "001");
		parametros.put("id_zona", id_zona);

		return (op_visualiza == 1)?generaReporte("reporte_analisis_inventario.jasper", parametros,
				"analisis_diferencia_inventario" + id_zona , request, response):
					generaReporteASwf("reporte_analisis_inventario.jasper", parametros,
							"analisis_diferencia_inventario" + id_zona , request, response);
	}
	
	@RequestMapping(value = "/ver_reporte_obligacionespago", method = RequestMethod.GET)
	public ModelAndView verReporteObligacionesDePago(@RequestParam int op_visualiza,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		Map parametros = new HashMap();
		parametros.put("id_empresa", "001");
		parametros.put("REPORT_LOCALE", java.util.Locale.ENGLISH);
		return (op_visualiza == 1)?generaReporte("ReporteCompromisoPago.jasper", parametros,
				"compromisos_obligaciones_pago" , request, response):
					generaReporteASwf("ReporteCompromisoPago.jasper", parametros,
							"compromisos_obligaciones_pago" , request, response);
	}
	
	@RequestMapping(value = "/ver_reporte_cajachica", method = RequestMethod.GET)
	public ModelAndView verReporteCajaChica(@RequestParam String id_rendicion,
			@RequestParam int op_visualiza, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		Map parametros = new HashMap();
		parametros.put("id_empresa", "001");
		parametros.put("id_rendicion", id_rendicion);
		
		ModelAndView mv = (op_visualiza == 1)?generaReporte("ReporteCajaChica.jasper",parametros,"caja_chica_" + id_rendicion, request, response):
											  generaReporteASwf("ReporteCajaChica.jasper",parametros,"caja_chica_" + id_rendicion, request, response);
		return mv;
	}
	
}
